package main;

import java.util.ArrayList;

import configs.Configuracao;
import util.Arquivo;
import base.Populacao;

public class Simulador {
	
	static String saidaMedia = "Media_"+Configuracao.funcao.getNome()
			+"_pais-roleta_filhos-elistismo_mut-gaussiana";
	
	static String boxplot = "Boxplot_"+Configuracao.funcao.getNome()
			+"_pais-roleta_filhos-elitismo_mut-gaussiana";
	
	static int numeroAmostras = 30;
	ArrayList<Double> media;
	ArrayList<Double> melhorPorAmostra;
	
	public static void main(String[] args) {
		
		Simulador s = new Simulador();
		
		s.media = init(Configuracao.INTERACOES);
		s.melhorPorAmostra = init(numeroAmostras);

		for (int i = 1; i <= numeroAmostras; i++) {
			System.out.println("Amostra "+i);
			
			Populacao p = new Populacao();
			p.evoluir();
			
			s.somarAmostra(p.getHistoricoConvergencia());
			
			double convergencia = p.getHistoricoConvergencia().get(p.getHistoricoConvergencia().size()-1);
			s.melhorPorAmostra.set(i-1, convergencia);
		}
		
		s.calcularMedia();
		s.finalizar();
	}
	
	public void somarAmostra(ArrayList<Double> amostra)
	{
		for(int i = 0; i < amostra.size(); i++)
		{
			this.media.set(i, this.media.get(i) + amostra.get(i));
		}
	}
	
	public void calcularMedia()
	{
		for(int i = 0; i < media.size(); i++)
		{
			media.set(i, (media.get(i)/numeroAmostras));
		}
	}

	public static ArrayList<Double> init(int tam)
	{
		ArrayList<Double> resp = new ArrayList<Double>();
		
		for(int i = 0; i < tam; i++)
		{
			resp.add(new Double(0));
		}
		
		return resp;
	}
	
	public void finalizar()
	{
		Arquivo a = new Arquivo(saidaMedia);
		a.Escrita();
		a.escrever(this.media, 200);
		a.close();
		
		Arquivo b = new Arquivo(boxplot);
		b.Escrita();
		b.escrever(this.melhorPorAmostra, 1);
		b.close();
	}
}
